সি# এ ল্যাম্বডা এক্সপ্রেশন এবং লিঙ্ক (LINQ) প্রোগ্রামিংকে আরও সহজ, কার্যকর, এবং এক্সপ্রেশনভিত্তিক করে তোলে। ল্যাম্বডা এক্সপ্রেশন একটি সংক্ষিপ্ত সিনট্যাক্স, যা অ্যানোনিমাস মেথড তৈরি করতে ব্যবহৃত হয় এবং লিঙ্ক (Language-Integrated Query বা LINQ) ব্যবহার করে ডেটা সংগ্রহের উপর কোয়েরি চালাতে অনেক সহজ করে তোলে। নিচে এই দুটি বিষয়ে বিস্তারিত আলোচনা করা হলো।
ল্যাম্বডা এক্সপ্রেশন হলো একটি সংক্ষিপ্ত সিনট্যাক্স যা অনামী (anonymous) মেথড তৈরি করতে ব্যবহার করা হয়। এটি ডেলিগেটের সঙ্গে কাজ করে এবং LINQ কোয়েরিগুলোতে ব্যবহার করা হয়।
ল্যাম্বডা এক্সপ্রেশন =>
অপারেটর ব্যবহার করে লেখা হয়। বামদিকে প্যারামিটার এবং ডানদিকে এক্সপ্রেশন বা কার্যকরী কোড থাকে।
(parameters) => expression
using System;
public class Program
{
public static void Main()
{
// ল্যাম্বডা এক্সপ্রেশন দিয়ে ডেলিগেট তৈরি
Func<int, int> square = x => x * x;
int result = square(5);
Console.WriteLine(result); // Output: 25
}
}
এখানে square
নামে একটি ডেলিগেট ব্যবহার করা হয়েছে, যা একটি int
প্যারামিটার গ্রহণ করে এবং একটি int
রিটার্ন করে। x => x * x
ল্যাম্বডা এক্সপ্রেশনটির মাধ্যমে square
ডেলিগেটকে সেট করা হয়েছে, যা x * x
ফলাফল প্রদান করে।
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(5, 10)); // Output: 15
এখানে (a, b) => a + b
ল্যাম্বডা এক্সপ্রেশনটি দুইটি প্যারামিটার গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে।
LINQ হলো এমন একটি টুল যা ডেটা সংগ্রহের উপর কোয়েরি চালানোর জন্য তৈরি করা হয়েছে। এটি ডেটাবেস, XML, ক্লাসের অবজেক্ট, এবং অন্যান্য ডেটা স্ট্রাকচারের সাথে কাজ করতে ব্যবহার করা হয়। LINQ ব্যবহার করে সরাসরি ডেটার উপর কার্যকরী কোয়েরি চালানো যায়।
LINQ এর প্রধান সুবিধাগুলো হলো:
ধরা যাক আমাদের একটি int
টাইপের তালিকা আছে এবং আমরা এই তালিকা থেকে নির্দিষ্ট কিছু সংখ্যাকে ফিল্টার করতে চাই।
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// কোয়েরি সিনট্যাক্স ব্যবহার
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (var number in evenNumbers)
{
Console.WriteLine(number); // Output: 2, 4, 6, 8
}
}
}
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// মেথড সিনট্যাক্স ব্যবহার
var evenNumbers = numbers.Where(x => x % 2 == 0);
foreach (var number in evenNumbers)
{
Console.WriteLine(number); // Output: 2, 4, 6, 8
}
}
}
LINQ এ অনেকগুলো অপারেটর আছে যেগুলো বিভিন্ন ডেটা ম্যানিপুলেশন কাজে ব্যবহৃত হয়। এর মধ্যে কয়েকটি গুরুত্বপূর্ণ অপারেটর হলো:
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// ফিল্টার করা
var evenNumbers = numbers.Where(x => x % 2 == 0);
// সংখ্যা গুনতে
var count = numbers.Count();
// সংখ্যা যোগ করতে
var sum = numbers.Sum();
Console.WriteLine("Even Numbers:");
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8
}
Console.WriteLine($"Total Count: {count}"); // Output: 9
Console.WriteLine($"Sum: {sum}"); // Output: 45
}
}
এইভাবে ল্যাম্বডা এক্সপ্রেশন এবং LINQ ব্যবহার করে সি# প্রোগ্রামে কার্যকরী ও সংক্ষিপ্ত কোড লেখা সম্ভব হয়।
ল্যাম্বডা এক্সপ্রেশন সি#-এর একটি সংক্ষিপ্ত পদ্ধতি, যা ফাংশন বা মেথড লেখাকে সহজ এবং সংক্ষিপ্ত করে তোলে। এটি এনোনিমাস মেথডের মতোই কাজ করে, তবে এর সিনট্যাক্স আরও সহজ এবং স্পষ্ট। সাধারণত, ল্যাম্বডা এক্সপ্রেশন ডেলিগেট, LINQ, ইভেন্ট এবং ফাংশনাল প্রোগ্রামিং প্যাটার্নে ব্যবহৃত হয়।
ল্যাম্বডা এক্সপ্রেশন লেখার নিয়ম:
(parameters) => expression_or_statement_block;
নিচে একটি সাধারণ ল্যাম্বডা এক্সপ্রেশন দেওয়া হয়েছে, যা দুটি সংখ্যার যোগফল বের করে:
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(5, 3)); // Output: 8
এখানে, Func<int, int, int>
ডেলিগেটটি ব্যবহার করা হয়েছে, যা দুটি int
প্যারামিটার গ্রহণ করে এবং একটি int
রিটার্ন করে। (a, b) => a + b
অংশটি ল্যাম্বডা এক্সপ্রেশন, যেখানে a
এবং b
প্যারামিটার এবং a + b
হচ্ছে আউটপুট।
১. সোজা এবং সংক্ষিপ্ত কোড: ল্যাম্বডা এক্সপ্রেশন কোডকে সহজ এবং সংক্ষিপ্ত করে তোলে। ২. LINQ এ ব্যবহৃত হয়: LINQ (Language Integrated Query) এ ল্যাম্বডা এক্সপ্রেশন প্রায়শই ব্যবহৃত হয়। ৩. কাস্টমাইজড ফাংশন পারামিটার: এটি ফাংশন বা মেথডে কাস্টমাইজড ফাংশনালিটি যুক্ত করতে সাহায্য করে।
LINQ এ ল্যাম্বডা এক্সপ্রেশন অনেক বেশি ব্যবহৃত হয়। নিচে একটি উদাহরণ দেওয়া হলো যেখানে একটি সংখ্যার তালিকায় ফিল্টারিং করা হয়েছে।
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে শুধুমাত্র জোড় সংখ্যা ফিল্টার করা
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
Console.WriteLine("Even Numbers:");
evenNumbers.ForEach(n => Console.WriteLine(n));
}
}
এখানে, n => n % 2 == 0
ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে numbers
তালিকার মধ্যে জোড় সংখ্যা ফিল্টার করা হয়েছে।
ল্যাম্বডা এক্সপ্রেশন Action এবং Predicate ডেলিগেটের সাথে সহজেই ব্যবহার করা যায়।
using System;
public class Program
{
public static void Main()
{
// Action ব্যবহার করে ল্যাম্বডা এক্সপ্রেশন
Action<string> greet = name => Console.WriteLine("Hello, " + name);
greet("John"); // Output: Hello, John
// Predicate ব্যবহার করে ল্যাম্বডা এক্সপ্রেশন
Predicate<int> isEven = number => number % 2 == 0;
Console.WriteLine(isEven(4)); // Output: True
}
}
উপরের উদাহরণে,
Action<string>
ব্যবহার করে একটি ল্যাম্বডা এক্সপ্রেশন তৈরি করা হয়েছে, যা একটি স্ট্রিং ইনপুট গ্রহণ করে এবং কনসোলে গ্রিটিং মেসেজ দেখায়।Predicate<int>
ব্যবহার করে ল্যাম্বডা এক্সপ্রেশন তৈরি করা হয়েছে, যা একটি সংখ্যা গ্রহণ করে এবং সেটি জোড় কি না তা যাচাই করে।ল্যাম্বডা এক্সপ্রেশন শুধুমাত্র একটি এক্সপ্রেশন নয়, বরং একটি স্টেটমেন্ট ব্লকও হতে পারে। একাধিক লাইন লিখতে {}
ব্যবহার করতে হবে।
Func<int, int, int> multiply = (a, b) =>
{
Console.WriteLine("Multiplying " + a + " and " + b);
return a * b;
};
Console.WriteLine(multiply(5, 4)); // Output: Multiplying 5 and 4, Result: 20
এখানে ল্যাম্বডা এক্সপ্রেশন স্টেটমেন্ট ব্লক আকারে লেখা হয়েছে, যেখানে কনসোলে একটি মেসেজ প্রিন্ট করার পরে গুণফল রিটার্ন করা হচ্ছে।
ল্যাম্বডা এক্সপ্রেশন সি#-এ কোড লেখাকে সহজ, সংক্ষিপ্ত এবং ফাংশনাল করে তোলে। এটি LINQ এবং ডেলিগেটের সাথে ব্যবহারের জন্য গুরুত্বপূর্ণ। ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে আপনি দ্রুত এবং দক্ষভাবে কোড লিখতে পারবেন, বিশেষ করে যেখানে ফাংশনাল প্রোগ্রামিং প্রয়োজন।
LINQ (লিংক) সি# প্রোগ্রামিং ল্যাঙ্গুয়েজে ডেটা কোয়েরি চালানোর একটি শক্তিশালী টুল যা বিভিন্ন ডেটা সোর্সের (যেমন: অ্যারে, লিস্ট, ডেটাবেস, XML) উপর কাজ করে। LINQ এর মাধ্যমে আমরা ডেটাকে সরাসরি কোয়েরি করতে পারি, যেটা SQL এর মতো ডেটাবেস কিউরির মতই কাজ করে তবে সাধারণ ডেটাসেটের উপরেও প্রয়োগ করা যায়। LINQ ব্যবহারের ফলে কোড আরও সংক্ষিপ্ত ও পড়তে সহজ হয়।
LINQ দুটি ধরনের সিনট্যাক্স সরবরাহ করে:
LINQ ব্যবহারের মাধ্যমে আমরা বিভিন্ন অপারেশন চালাতে পারি, যেমন:
Where
)OrderBy
, OrderByDescending
)Select
)GroupBy
)Count
)Sum
, Average
)using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// কোয়েরি সিনট্যাক্স ব্যবহার করে ফিল্টার করা
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
Console.WriteLine("Even Numbers:");
foreach (var number in evenNumbers)
{
Console.WriteLine(number); // Output: 2, 4, 6, 8
}
}
}
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// মেথড সিনট্যাক্স ব্যবহার করে ফিল্টার করা
var evenNumbers = numbers.Where(x => x % 2 == 0);
Console.WriteLine("Even Numbers:");
foreach (var number in evenNumbers)
{
Console.WriteLine(number); // Output: 2, 4, 6, 8
}
}
}
LINQ অনেকগুলো অপারেশন সরবরাহ করে যা ডেটা নিয়ে বিভিন্ন ধরনের কাজ করতে ব্যবহার করা হয়। নিচে LINQ এর কয়েকটি সাধারণ অপারেশন নিয়ে উদাহরণ দেওয়া হলো:
Where
: নির্দিষ্ট শর্ত পূরণ করা ডেটা ফিল্টার করাvar evenNumbers = numbers.Where(x => x % 2 == 0);
Select
: ডেটা সংগ্রহ থেকে নির্দিষ্ট ফিল্ড বা উপাদান নির্বাচন করাList<string> names = new List<string> { "Alice", "Bob", "Charlie" };
var nameLengths = names.Select(name => name.Length);
foreach (var length in nameLengths)
{
Console.WriteLine(length); // Output: 5, 3, 7
}
OrderBy
এবং OrderByDescending
: ডেটা ক্রমানুসারে সাজানোvar orderedNumbers = numbers.OrderBy(x => x);
var descendingNumbers = numbers.OrderByDescending(x => x);
GroupBy
: ডেটাকে নির্দিষ্ট শর্ত অনুযায়ী গ্রুপ করাList<string> fruits = new List<string> { "Apple", "Banana", "Cherry", "Avocado", "Blueberry" };
var groupedFruits = fruits.GroupBy(fruit => fruit[0]);
foreach (var group in groupedFruits)
{
Console.WriteLine("Fruits that start with: " + group.Key);
foreach (var fruit in group)
{
Console.WriteLine(fruit);
}
}
Count
, Sum
, Average
: ডেটা গণনা ও গাণিতিক অপারেশনint count = numbers.Count();
int sum = numbers.Sum();
double average = numbers.Average();
Console.WriteLine($"Count: {count}, Sum: {sum}, Average: {average}");
// Output: Count: 9, Sum: 45, Average: 5
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<string> students = new List<string> { "Alice", "Bob", "Charlie", "Alex", "Brian" };
// যেখানে নামের দৈর্ঘ্য ৪ বা তার বেশি, তাদের ফিল্টার করুন এবং সাজান
var filteredStudents = students
.Where(s => s.Length >= 4)
.OrderBy(s => s)
.Select(s => s.ToUpper());
Console.WriteLine("Filtered and Ordered Students:");
foreach (var student in filteredStudents)
{
Console.WriteLine(student);
}
}
}
Where
অপারেটরের মাধ্যমে ফিল্টার করেছি যাদের নামের দৈর্ঘ্য ৪ বা তার বেশি।OrderBy
অপারেটর ব্যবহার করে নামগুলোকে ক্রমানুসারে সাজানো হয়েছে।Select
অপারেটরের মাধ্যমে প্রতিটি নামকে uppercase এ রূপান্তরিত করেছি।LINQ ব্যবহার করে সি# এ ডেটা ম্যানিপুলেশনকে অনেক সহজ করা যায়। এটি ডেটাবেস কোয়েরির মতই কাজ করে, তাই ডেটা প্রসেসিং বা ডেটা বিশ্লেষণে LINQ অনেক গুরুত্বপূর্ণ।
LINQ (Language Integrated Query) হলো সি#-এ একটি শক্তিশালী টুল, যা বিভিন্ন ডেটা সোর্স থেকে সহজ এবং সংক্ষিপ্ত উপায়ে ডেটা রিটার্ন এবং ম্যানিপুলেট করতে সাহায্য করে। LINQ বিভিন্ন ধরনের ডেটা সোর্স, যেমন অ্যারে, লিস্ট, ডাটাবেস এবং XML থেকে ডেটা এক্সেস ও প্রসেস করতে ব্যবহৃত হয়।
LINQ-এর দুটি মূল সিনট্যাক্স রয়েছে:
কোয়েরি সিনট্যাক্স SQL-এর মতো দেখতে এবং সহজেই বুঝতে পারা যায়। এটি সাধারণত from
, where
, select
এবং অন্যান্য কীওয়ার্ড ব্যবহার করে।
উদাহরণ: একটি ইনটিজার তালিকা থেকে জোড় সংখ্যাগুলি বের করা
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// কোয়েরি সিনট্যাক্স ব্যবহার করে জোড় সংখ্যা ফিল্টার করা
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
Console.WriteLine("Even Numbers:");
foreach (var number in evenNumbers)
{
Console.WriteLine(number);
}
}
}
উপরের উদাহরণে:
from num in numbers
: numbers
তালিকা থেকে num
নামে একটি ভেরিয়েবল নির্বাচিত করা হয়েছে।where num % 2 == 0
: যেখানে num
জোড় সংখ্যা, সেই আইটেমগুলো ফিল্টার করা হচ্ছে।select num
: ফিল্টার করা সংখ্যাগুলো নির্বাচন করা হচ্ছে।মেথড সিনট্যাক্সে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে বিভিন্ন মেথড কল করা হয়। এটি অনেক ফ্লেক্সিবল এবং ফাংশনাল প্রোগ্রামিং স্টাইলের জন্য প্রযোজ্য।
উদাহরণ: একটি স্ট্রিং তালিকা থেকে নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং খুঁজে বের করা
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<string> words = new List<string> { "apple", "banana", "cherry", "date", "fig", "grape" };
// মেথড সিনট্যাক্স ব্যবহার করে ৫ অক্ষরের শব্দ ফিল্টার করা
var fiveLetterWords = words.Where(word => word.Length == 5).ToList();
Console.WriteLine("Words with 5 letters:");
fiveLetterWords.ForEach(word => Console.WriteLine(word));
}
}
এখানে:
words.Where(word => word.Length == 5)
: words
তালিকার মধ্যে সেই শব্দগুলো ফিল্টার করা হয়েছে যেগুলোর দৈর্ঘ্য ৫।.ToList()
: ফিল্টারকৃত ফলাফলকে তালিকা আকারে কনভার্ট করা হয়েছে।LINQ-এ অনেক গুরুত্বপূর্ণ অপারেটর রয়েছে, যেগুলো ডেটা ফিল্টারিং, সাজানো, গ্রুপিং, এবং বিভিন্ন ধরনের জটিল কাজ করতে ব্যবহৃত হয়। নিচে কয়েকটি উল্লেখযোগ্য অপারেটর সহ উদাহরণ দেওয়া হলো:
Select
: একটি সংগ্রহের প্রতিটি আইটেমের ওপর প্রক্রিয়াকরণ করে একটি নতুন সংগ্রহ তৈরি করতে।List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var squares = numbers.Select(num => num * num).ToList(); // { 1, 4, 9, 16, 25 }
Where
: ফিল্টার করার জন্য ব্যবহৃত হয়।List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(num => num % 2 == 0).ToList(); // { 2, 4 }
OrderBy
এবং OrderByDescending
: ক্রম বা বিপরীত ক্রমে সাজানোর জন্য।List<string> names = new List<string> { "John", "Anna", "Zara", "Michael" };
var sortedNames = names.OrderBy(name => name).ToList(); // Ascending order
var descendingNames = names.OrderByDescending(name => name).ToList(); // Descending order
GroupBy
: নির্দিষ্ট কী অনুযায়ী গ্রুপ করতে।List<string> names = new List<string> { "John", "Jake", "Anna", "Zara" };
var groupedNames = names.GroupBy(name => name[0]); // Group by first letter
foreach (var group in groupedNames)
{
Console.WriteLine("Group: " + group.Key);
foreach (var name in group)
{
Console.WriteLine(name);
}
}
Sum
, Count
, Average
, Min
, Max
: সংক্ষেপক ফাংশন।List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int sum = numbers.Sum(); // 15
int count = numbers.Count(); // 5
double average = numbers.Average(); // 3
int min = numbers.Min(); // 1
int max = numbers.Max(); // 5
নিচে একটি উদাহরণ দেওয়া হলো যেখানে একাধিক অপারেটর একসাথে ব্যবহৃত হয়েছে।
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// জোড় সংখ্যা ফিল্টার করা, তারপর তা বর্গ করে এবং অবশেষে সাজানো
var query = numbers
.Where(num => num % 2 == 0)
.Select(num => num * num)
.OrderByDescending(num => num)
.ToList();
Console.WriteLine("Even squares in descending order:");
query.ForEach(num => Console.WriteLine(num));
}
}
এখানে:
Where(num => num % 2 == 0)
: জোড় সংখ্যা ফিল্টার করা।Select(num => num * num)
: প্রতিটি সংখ্যার বর্গ বের করা।OrderByDescending(num => num)
: বর্গকৃত সংখ্যা ডেসেন্ডিং অর্ডারে সাজানো।LINQ হলো সি#-এ ডেটা প্রসেসিং এবং কনডিশন-ভিত্তিক কুয়েরি চালানোর একটি সহজ এবং সংক্ষিপ্ত উপায়। কোয়েরি এবং মেথড সিনট্যাক্সের মাধ্যমে LINQ প্রোগ্রামিংকে আরও সহজ করে তোলে এবং ডেটা ম্যানিপুলেশনে খুব কার্যকর।
আরও দেখুন...